import { FCWebClient, FCWebBodyType, FCWebErrorType } from 'fc-cli-web'
import { message } from 'ant-design-vue'

const host = '/payment';
const paymentClient = new FCWebClient({
    host,
    bodyType: FCWebBodyType.json,
    baseHeaders: {},
    authHeaders: {},
    baseParams: null,
    authParams: null,
  })

const success_code = '200';
/* 服务端返回的 errorCode 类型 */
const error_code = {
  auth_fail: '111111001',
  params_error: '0016',
  logic_error: '0001',
  unknown: '9999',
  valid_error: '0015',
  valid_error1: '0003',
}

/**
 * 服务返回结构转换为 {data, error:{type, code, message}}
 */

paymentClient.onBeforeSuccess = (response) => {
  const { code, msg, data } = response.data
  // 业务成功，包装为 { data }
  if (code === success_code) {
    return { data }
  }

  // api error
  let type = FCWebErrorType.api

  if (code === error_code.auth_fail) {
    type = FCWebErrorType.auth
  }

  // 业务失败，包装为 { error: {type, code, message}}
  // 包装好的 error 会发送给 onError 再处理一次，处理报错信息
  const error = { type, code, message: msg }
  return { error }
}

/**
 * 根据不同的错误类型，决定集中处理方式
 * selfCare 指定当前错误是否由调用方自行处理
 */

paymentClient.onError = (error, selfCare = false) => {
  console.log(error)
  // auth_fail 不受 selfCare 限制，默认集中处理
  if (error.code === error_code.auth_fail) {
    console.log('>> auth fail, need navigate to login')
  }
  // params_error  参数问题
  if (error.code === error_code.params_error) {
    message.error(error.message)
  }
  // valid_error  校验问题
  if (error.code === error_code.valid_error || error.code === error_code.valid_error1) {
    message.error(error.message)
  }

  // 集中处理 error
  if (!selfCare) {
    console.log("handle error:", error);
    message.error(error.message)
  }
}

export default paymentClient
export {
  host,
  success_code as successCode,
  error_code as errorCode,
}